TypeScriptã®ã¢ãžã¥ãŒã«å®£èšãç¿åŸïŒå€éšã©ã€ãã©ãªåãã®ã¢ã³ããšã³ãã¢ãžã¥ãŒã«ãšããŠãããŒãµã«ååãã®ã°ããŒãã«åå®çŸ©ãã°ããŒãã«ããŒã ã§ã®ã³ãŒãå質ãšä¿å®æ§ãåäžãããŸãã
TypeScriptã¢ãžã¥ãŒã«å®£èšïŒå ç¢ãªã°ããŒãã«éçºã®ããã®ã¢ã³ããšã³ãã¢ãžã¥ãŒã«ãšã°ããŒãã«åå®çŸ©ã䜿ãããªã
çŸä»£ã®ãœãããŠã§ã¢éçºã®åºå€§ã§çžäºæ¥ç¶ãããäžçã§ã¯ãããŒã ã¯ãã°ãã°å€§éžããŸããããã·ãŒã ã¬ã¹ãªçµ±åãé«ãä¿å®æ§ãäºæž¬å¯èœãªåäœãå¿ èŠãšãããããžã§ã¯ãã«åãçµãã§ããŸããTypeScriptã¯ãããã®ç®æšãéæããããã®éèŠãªããŒã«ãšããŠæµ®äžããJavaScriptã³ãŒãããŒã¹ã«æçããšå埩åãããããéçåä»ããæäŸããŸãã倿§ãªã¢ãžã¥ãŒã«ãã©ã€ãã©ãªã«ããã£ãŠåãå®çŸ©ãã匷å¶ããèœåã¯ãè€éãªã¢ããªã±ãŒã·ã§ã³ã§ååããåœéããŒã ã«ãšã£ãŠéåžžã«äŸ¡å€ããããŸãã
ããããTypeScriptãããžã§ã¯ãã¯ãã£ãã«åç¬ã§ååšããããã§ã¯ãããŸãããæ¢åã®JavaScriptã©ã€ãã©ãªãšé »ç¹ã«é£æºãããã©ãŠã¶ãã€ãã£ãAPIãšçµ±åããããã°ããŒãã«ã«å©çšå¯èœãªãªããžã§ã¯ããæ¡åŒµãããããŸããããã§TypeScriptã®å®£èšãã¡ã€ã«ïŒ.d.tsïŒãäžå¯æ¬ ã«ãªããŸããããã«ãããã©ã³ã¿ã€ã åäœã倿Žããã«TypeScriptã³ã³ãã€ã©ã«JavaScriptã³ãŒãã®åœ¢ç¶ãèšè¿°ã§ããŸãããã®åŒ·åãªã¡ã«ããºã ã®äžã§ãå€éšã®åãæ±ãããã®2ã€ã®äž»èŠãªã¢ãããŒããéç«ã£ãŠããŸããããã¯ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšãšã°ããŒãã«åå®çŸ©ã§ãã
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«ãšã°ããŒãã«åå®çŸ©ããã€ãã©ã®ããã«å¹æçã«äœ¿çšããããçè§£ããããšã¯ãããããTypeScriptéçºè ãç¹ã«ã°ããŒãã«ãªãŒãã£ãšã³ã¹åãã®LèŠæš¡ã§ãšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããéçºè ã«ãšã£ãŠåºæ¬ã§ãã誀ã£ãé©çšã¯ãåè¡çªãäžæçãªäŸåé¢ä¿ãããã³ä¿å®æ§ã®äœäžã«ã€ãªããå¯èœæ§ããããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ããããã®æŠå¿µãæ·±ãæãäžããããŒã ã®èŠæš¡ãå°ççååžã«é¢ä¿ãªããTypeScriptãããžã§ã¯ãã§æ å ±ã«åºã¥ããæ±ºå®ãäžãã®ã«åœ¹ç«ã€å®çšçãªäŸãšãã¹ããã©ã¯ãã£ã¹ãæäŸããŸãã
TypeScriptåã·ã¹ãã ãšãã®ã°ããŒãã«ãœãããŠã§ã¢éçºã«ããã圹å²
TypeScriptã¯JavaScriptãæ¡åŒµããéçåã远å ããããšã§ãéçºè ã¯ã©ã³ã¿ã€ã æã§ã¯ãªãéçºãµã€ã¯ã«ã®æ©ã段éã§ãšã©ãŒãæ€åºã§ããããã«ãªããŸããã°ããŒãã«ã«åæ£ããããŒã ã«ãšã£ãŠãããã¯ããã€ãã®å€§ããªå©ç¹ããããããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ã®åŒ·åïŒæç€ºçãªåã«ãããç°ãªãã¿ã€ã ãŸãŒã³ãæåçèæ¯ãæã€ããŒã ã¡ã³ããŒã¯ã颿°ãã€ã³ã¿ãŒãã§ãŒã¹ãã¯ã©ã¹ã®æåŸ ãããå ¥åãšåºåããã容æã«çè§£ã§ãã誀解ãã³ãã¥ãã±ãŒã·ã§ã³ã®ãªãŒããŒããããåæžããŸãã
- ä¿å®æ§ã®åäžïŒãããžã§ã¯ããé²åããããŸããŸãªããŒã ã«ãã£ãŠæ°æ©èœã远å ãããã«ã€ããŠãå宣èšã¯å¥çŽãšããŠæ©èœããã·ã¹ãã ã®ããéšåã§ã®å€æŽã誀ã£ãŠå¥ã®éšåãå£ããªãããã«ããŸããããã¯é·æééçšãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéèŠã§ãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®èªä¿¡ïŒå€ãã®è²¢ç®è ã«ãã£ãŠæéããããŠæ§ç¯ãããå€§èŠæš¡ãªã³ãŒãããŒã¹ã¯ãTypeScriptã®ãªãã¡ã¯ã¿ãªã³ã°æ©èœãã倧ããªæ©æµãåããŸããã³ã³ãã€ã©ã¯éçºè ãå¿ èŠãªåã®æŽæ°ãã¬ã€ãããå€§èŠæš¡ãªæ§é 倿Žã®è² æ ã軜æžããŸãã
- ããŒã«ãµããŒãïŒãªãŒãã³ã³ããªãŒããã·ã°ããã£ãã«ããã€ã³ããªãžã§ã³ããªãšã©ãŒå ±åãªã©ã®é«åºŠãªIDEæ©èœã¯ãTypeScriptã®åæ å ±ã«ãã£ãŠåŒ·åãããäžçäžã®éçºè ã®çç£æ§ãåäžãããŸãã
æ¢åã®JavaScriptã§TypeScriptãæŽ»çšããæ žãšãªãã®ã¯ãå宣èšãã¡ã€ã«ïŒ.d.tsïŒã§ãããããã®ãã¡ã€ã«ã¯æ©æž¡ã圹ãšããŠæ©èœããTypeScriptã³ã³ãã€ã©ãããèªäœã§ã¯æšè«ã§ããªãJavaScriptã³ãŒãã«é¢ããåæ
å ±ãæäŸããŸããããã«ãããã·ãŒã ã¬ã¹ãªçžäºéçšæ§ãå¯èœã«ãªããTypeScriptã¯JavaScriptã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãå®å
šã«å©çšã§ããŸãã
å宣èšãã¡ã€ã«ïŒ.d.tsïŒãçè§£ãã
.d.tsãã¡ã€ã«ã«ã¯åå®çŸ©ã®ã¿ãå«ãŸããå®éã®å®è£
ã³ãŒãã¯å«ãŸããŸãããããã¯C++ã®ããããŒãã¡ã€ã«ãJavaã®ã€ã³ã¿ãŒãã§ãŒã¹ãã¡ã€ã«ã«äŒŒãŠãããã¢ãžã¥ãŒã«ãŸãã¯ã°ããŒãã«ãšã³ãã£ãã£ã®å
¬éAPIãèšè¿°ããŸããTypeScriptã³ã³ãã€ã©ããããžã§ã¯ããåŠçããéããããã®å®£èšãã¡ã€ã«ãæ¢ããŠãå€éšJavaScriptã³ãŒãã«ãã£ãŠæäŸãããåãçè§£ããŸããããã«ãããTypeScriptã³ãŒãã¯JavaScript颿°ãåŒã³åºããJavaScriptã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããJavaScriptãªããžã§ã¯ããšå®å
šã«åå®å
šã«é£æºã§ããŸãã
ã»ãšãã©ã®äººæ°ã®ããJavaScriptã©ã€ãã©ãªã«ã€ããŠã¯ãå宣èšã¯npmã®@typesçµç¹ïŒDefinitelyTypedãããžã§ã¯ãã«ãã£ãŠæäŸïŒãéããŠãã§ã«å©çšå¯èœã§ããäŸãã°ãnpm install @types/reactãã€ã³ã¹ããŒã«ãããšãReactã©ã€ãã©ãªã®åå®çŸ©ãæäŸãããŸãããã ããç¬èªã®å®£èšãã¡ã€ã«ãäœæããå¿
èŠãããã·ããªãªããããŸãã
- åå®çŸ©ããªãã«ã¹ã¿ã ã®ç€Ÿå JavaScriptã©ã€ãã©ãªã䜿çšããå Žåã
- å€ããããŸãã¡ã³ããã³ã¹ãããŠããªããµãŒãããŒãã£ã©ã€ãã©ãªãæ±ãå Žåã
- éJavaScriptã¢ã»ããïŒäŸïŒç»åãCSSã¢ãžã¥ãŒã«ïŒã®åã宣èšããå Žåã
- ã°ããŒãã«ãªããžã§ã¯ããŸãã¯ãã€ãã£ãåãæ¡åŒµããå Žåã
ãããã®ã«ã¹ã¿ã 宣èšã·ããªãªã«ãããŠãã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšãšã°ããŒãã«åå®çŸ©ã®åºå¥ãéèŠã«ãªããŸãã
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšïŒdeclare module 'module-name'ïŒ
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšã¯ãç¬èªã®åå®çŸ©ãæããªãå€éšJavaScriptã¢ãžã¥ãŒã«ã®åœ¢ç¶ãèšè¿°ããããã«äœ¿çšãããŸããåºæ¬çã«ãTypeScriptã³ã³ãã€ã©ã«ã'X'ãšããååã®ã¢ãžã¥ãŒã«ãããããã®ãšã¯ã¹ããŒãã¯ãããªåœ¢ã§ããããšäŒããŸããããã«ããããã®ã¢ãžã¥ãŒã«ãTypeScriptã³ãŒãã«importãŸãã¯requireããå®å
šãªåãã§ãã¯ãè¡ãããšãã§ããŸãã
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšã䜿çšããææ
以äžã®ç¶æ³ã§ã¯ãã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšãéžæããå¿ èŠããããŸãã
@typesããã±ãŒãžããªããµãŒãããŒãã£JavaScriptã©ã€ãã©ãªïŒå ¬åŒã®@typesããã±ãŒãžããªãJavaScriptã©ã€ãã©ãªïŒäŸïŒå€ããŠãŒãã£ãªãã£ãç¹æ®ãªã°ã©ãããŒã«ãç¬èªã®ç€Ÿå ã©ã€ãã©ãªïŒã䜿çšããŠããå Žåãã¢ãžã¥ãŒã«ãèªåã§å®£èšããå¿ èŠããããŸãã- ã«ã¹ã¿ã JavaScriptã¢ãžã¥ãŒã«ïŒã¢ããªã±ãŒã·ã§ã³ã®ã¬ã¬ã·ãŒéšåããã¬ãŒã³JavaScriptã§æžãããŠãããTypeScriptããããã䜿çšãããå Žåããã®ã¢ãžã¥ãŒã«ã宣èšã§ããŸãã
- éã³ãŒãã¢ã»ããã®ã€ã³ããŒãïŒJavaScriptã³ãŒãããšã¯ã¹ããŒãããªããããã³ãã©ãŒïŒWebpackãRollupãªã©ïŒã«ãã£ãŠåŠçãããã¢ãžã¥ãŒã«ïŒç»åïŒ
.svgã.pngïŒãCSSã¢ãžã¥ãŒã«ïŒ.cssã.scssïŒãJSONãã¡ã€ã«ãªã©ïŒã®å Žåãåå®å šãªã€ã³ããŒããå¯èœã«ããããã«ã¢ãžã¥ãŒã«ãšããŠå®£èšã§ããŸãã
æ§æãšæ§é
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšã¯éåžžã.d.tsãã¡ã€ã«å
ã«ååšãããã®åºæ¬çãªæ§é ã«åŸããŸãã
declare module 'module-name' {
// Declare exports here
export function myFunction(arg: string): number;
export const myConstant: string;
export interface MyInterface { prop: boolean; }
export class MyClass { constructor(name: string); greeting: string; }
// If the module exports a default, use 'export default'
export default function defaultExport(value: any): void;
}
module-nameã¯ãimportã¹ããŒãã¡ã³ãã§äœ¿çšããæååïŒäŸïŒ'lodash-es-legacy'ã'./utils/my-js-utility'ïŒãšå®å
šã«äžèŽããå¿
èŠããããŸãã
å®çšäŸ1ïŒ@typesããã±ãŒãžããªããµãŒãããŒãã£ã©ã€ãã©ãª
åå®çŸ©ããªã'd3-legacy-charts'ãšããã¬ã¬ã·ãŒJavaScriptã°ã©ãã©ã€ãã©ãªã䜿çšããŠãããšæ³åããŠãã ãããJavaScriptãã¡ã€ã«node_modules/d3-legacy-charts/index.jsã¯æ¬¡ã®ããã«ãªããããããŸããã
// d3-legacy-charts/index.js (simplified)
export function createBarChart(data, elementId) {
console.log('Creating bar chart with data:', data, 'on', elementId);
// ... actual D3 chart creation logic ...
return { success: true, id: elementId };
}
export function createLineChart(data, elementId) {
console.log('Creating line chart with data:', data, 'on', elementId);
// ... actual D3 chart creation logic ...
return { success: true, id: elementId };
}
ãããTypeScriptãããžã§ã¯ãã§äœ¿çšããã«ã¯ãäŸãã°src/types/d3-legacy-charts.d.tsãšãã宣èšãã¡ã€ã«ãäœæããŸãã
declare module 'd3-legacy-charts' {
interface ChartResult {
success: boolean;
id: string;
}
export function createBarChart(data: number[], elementId: string): ChartResult;
export function createLineChart(data: { x: number; y: number }[], elementId: string): ChartResult;
}
ããã§ãTypeScriptã³ãŒãã§åå®å šã«ã€ã³ããŒãããŠäœ¿çšã§ããŸãã
import { createBarChart, createLineChart } from 'd3-legacy-charts';
const chartData = [10, 20, 30, 40, 50];
const lineChartData = [{ x: 1, y: 10 }, { x: 2, y: 20 }];
const barChartStatus = createBarChart(chartData, 'myBarChartContainer');
console.log(barChartStatus.success); // Type-checked access
// TypeScript will now correctly flag if you pass wrong arguments:
// createLineChart(chartData, 'anotherContainer'); // Error: Argument of type 'number[]' is not assignable to parameter of type '{ x: number; y: number; }[]'.
tsconfig.jsonã«ã«ã¹ã¿ã åãã£ã¬ã¯ããªãå«ãŸããŠããããšã確èªããŠãã ããã
{
"compilerOptions": {
// ... other options
"typeRoots": ["./node_modules/@types", "./src/types"]
},
"include": ["src/**/*.ts", "src/**/*.d.ts"]
}
å®çšäŸ2ïŒéã³ãŒãã¢ã»ããã®å®£èš
Webpackã®ãããªãã³ãã©ãŒã䜿çšããå ŽåãéJavaScriptã¢ã»ãããã³ãŒãã«çŽæ¥ã€ã³ããŒãããããšããããããŸããäŸãã°ãSVGãã¡ã€ã«ãã€ã³ããŒããããšããã®ãã¹ãŸãã¯Reactã³ã³ããŒãã³ã¹ãè¿ãããå ŽåããããŸãããããåå®å šã«ããã«ã¯ããããã®ãã¡ã€ã«ã¿ã€ããã¢ãžã¥ãŒã«ãšããŠå®£èšã§ããŸãã
äŸãã°ãsrc/types/assets.d.tsãšãããã¡ã€ã«ãäœæããŸãã
declare module '*.svg' {
import React = require('react');
export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement> & React.HTMLAttributes<SVGSVGElement>>;
const src: string;
export default src;
}
declare module '*.png' {
const value: string;
export default value;
}
declare module '*.jpg' {
const value: string;
export default value;
}
declare module '*.jpeg' {
const value: string;
export default value;
}
declare module '*.gif' {
const value: string;
export default value;
}
declare module '*.bmp' {
const value: string;
export default value;
}
declare module '*.tiff' {
const value: string;
export default value;
}
declare module '*.webp' {
const value: string;
export default value;
}
declare module '*.ico' {
const value: string;
export default value;
}
declare module '*.avif' {
const value: string;
export default value;
}
ããã§ãç»åãã¡ã€ã«ãåå®å šã«ã€ã³ããŒãã§ããŸãã
import myImage from './assets/my-image.png';
import { ReactComponent as MyIcon } from './assets/my-icon.svg';
function MyComponent() {
return (
<div>
<img src={myImage} alt="My Image" />
<MyIcon style={{ width: 24, height: 24 }} />
</div>
);
}
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšã®äž»èŠãªèæ ®äºé
- ç²åºŠïŒãã¹ãŠã®ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšã«å¯ŸããŠåäžã®
.d.tsãã¡ã€ã«ãäœæããããšããè«ççã«åå²ããããšãã§ããŸãïŒäŸïŒlegacy-libs.d.tsãasset-declarations.d.tsïŒãã°ããŒãã«ããŒã ã®å Žåãæç¢ºãªåé¢ãšåœåèŠåã¯çºèŠå¯èœæ§ã«ãšã£ãŠäžå¯æ¬ ã§ãã - é
çœ®ïŒæ
£äŸãšããŠãã«ã¹ã¿ã
.d.tsãã¡ã€ã«ã¯ãããžã§ã¯ãã®ã«ãŒãã«ããsrc/types/ãŸãã¯types/ãã£ã¬ã¯ããªã«é 眮ãããŸããtsconfig.jsonããããã®ãã¹ãtypeRootsã«å«ããŠããããæé»çã«èªèãããªãå Žåã¯ç¢ºèªããŠãã ããã - ã¡ã³ããã³ã¹ïŒæåã§åä»ãããã©ã€ãã©ãªã®å
¬åŒ
@typesããã±ãŒãžãå©çšå¯èœã«ãªã£ãå Žåãç«¶åãé¿ããå ¬åŒã®ããã°ãã°ããå®å šãªåå®çŸ©ããæ©æµãåããããã«ãã«ã¹ã¿ã ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšãåé€ããå¿ èŠããããŸãã - ã¢ãžã¥ãŒã«è§£æ±ºïŒ
tsconfig.jsonãé©åãªmoduleResolutionèšå®ïŒäŸïŒ"node"ïŒãæã£ãŠããããšã確èªããTypeScriptãã©ã³ã¿ã€ã ã§å®éã®JavaScriptã¢ãžã¥ãŒã«ãèŠã€ããããããã«ããŸãã
ã°ããŒãã«åå®çŸ©ïŒdeclare globalïŒ
ç¹å®ã®ã¢ãžã¥ãŒã«ãèšè¿°ããã¢ã³ããšã³ãã¢ãžã¥ãŒã«ãšã¯å¯Ÿç
§çã«ãã°ããŒãã«åå®çŸ©ã¯ã°ããŒãã«ã¹ã³ãŒããæ¡åŒµãŸãã¯å¢è£ããŸããããã¯ãdeclare globalãããã¯å
ã§å®£èšãããåãã€ã³ã¿ãŒãã§ãŒã¹ããŸãã¯å€æ°ããæç€ºçãªimportã¹ããŒãã¡ã³ããªãã§TypeScriptãããžã§ã¯ãã®ã©ãã§ãå©çšå¯èœã«ãªãããšãæå³ããŸãããããã®å®£èšã¯éåžžããã¡ã€ã«ãã°ããŒãã«ã¹ã¯ãªãããã¡ã€ã«ãšããŠæ±ãããã®ãé²ãããã«ãã¢ãžã¥ãŒã«ïŒäŸïŒç©ºã®ã¢ãžã¥ãŒã«ãŸãã¯ãšã¯ã¹ããŒããæã€ã¢ãžã¥ãŒã«ïŒå
ã«é
眮ãããŸããããã«ããããã¹ãŠã®å®£èšãããã©ã«ãã§ã°ããŒãã«ã«ãªãã®ãé²ããŸãã
ã°ããŒãã«åå®çŸ©ã䜿çšããææ
ã°ããŒãã«åå®çŸ©ã¯ã次ã®å Žåã«é©ããŠããŸãã
- ãã©ãŠã¶ã°ããŒãã«ãªããžã§ã¯ãã®æ¡åŒµïŒ
windowãdocumentãHTMLElementãªã©ã®æšæºãã©ãŠã¶ãªããžã§ã¯ãã«ã«ã¹ã¿ã ããããã£ãã¡ãœããã远å ããå Žåã - ã°ããŒãã«å€æ°/ãªããžã§ã¯ãã®å®£èšïŒã¢ããªã±ãŒã·ã§ã³ã®ã©ã³ã¿ã€ã å šäœã§çã«ã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªå€æ°ããªããžã§ã¯ãïŒäŸïŒã°ããŒãã«èšå®ãªããžã§ã¯ãããŸãã¯ãã€ãã£ãåã®ãããã¿ã€ãã倿Žããããªãã£ã«ïŒã®å Žåã
- ããªãã£ã«ããã³ã·ã ã©ã€ãã©ãªïŒãã€ãã£ãåã«ã¡ãœããã远å ããããªãã£ã«ïŒäŸïŒ
Array.prototype.myCustomMethodïŒãå°å ¥ããå Žåã - Node.jsã°ããŒãã«ãªããžã§ã¯ãã®æ¡åŒµïŒãã©ãŠã¶ã®
windowãšåæ§ã«ããµãŒããŒãµã€ãã¢ããªã±ãŒã·ã§ã³ã®ããã«Node.jsã®globalãŸãã¯process.envãæ¡åŒµããå Žåã
æ§æãšæ§é
ã°ããŒãã«ã¹ã³ãŒããå¢è£ããã«ã¯ãdeclare globalãããã¯ãã¢ãžã¥ãŒã«å
ã«é
眮ããå¿
èŠããããŸããããã¯ã.d.tsãã¡ã€ã«ã«å°ãªããšã1ã€ã®importãŸãã¯exportã¹ããŒãã¡ã³ãïŒç©ºã®ãã®ã§ãããïŒãå«ãŸããŠããŠãã¢ãžã¥ãŒã«ãšããŠæ©èœããããã«ããå¿
èŠãããããšãæå³ããŸãããããã€ã³ããŒã/ãšã¯ã¹ããŒãã®ãªãã¹ã¿ã³ãã¢ãã³ã®.d.tsãã¡ã€ã«ã§ããã°ããã®å®£èšã¯ãã¹ãŠããã©ã«ãã§ã°ããŒãã«ã«ãªããdeclare globalã¯å³å¯ã«ã¯å¿
èŠãããŸããããæå³ãæç¢ºã«ããããã«æç€ºçã«äœ¿çšããã®ãè¯ãã§ãããã
// Example of a module that augments the global scope
// global.d.ts or augmentations.d.ts
export {}; // Makes this file a module, so declare global can be used
declare global {
interface Window {
myGlobalConfig: { apiUrl: string; version: string; };
myAnalyticsTracker: (eventName: string, data?: object) => void;
}
// Declare a global function
function calculateChecksum(data: string): string;
// Declare a global variable
var MY_APP_NAME: string;
// Extend a native interface (e.g., for polyfills)
interface Array<T> {
first(): T | undefined;
last(): T | undefined;
}
}
å®çšäŸ1ïŒWindowãªããžã§ã¯ãã®æ¡åŒµ
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®èšå®ïŒããããã¬ã¬ã·ãŒJavaScriptãã³ãã«ãŸãã¯ããŒãžã«æ³šå
¥ãããå€éšã¹ã¯ãªããïŒãããã©ãŠã¶ã®windowãªããžã§ã¯ãã«çŽæ¥myAppConfigãªããžã§ã¯ããšanalytics颿°ãå
¬éããŠãããšããŸããTypeScriptããããããå®å
šã«ã¢ã¯ã»ã¹ããã«ã¯ãäŸãã°src/types/window.d.tsãšãã宣èšãã¡ã€ã«ãäœæããŸãã
// src/types/window.d.ts
export {}; // This makes the file a module, allowing 'declare global'
declare global {
interface Window {
myAppConfig: {
apiBaseUrl: string;
environment: 'development' | 'production';
featureFlags: Record<string, boolean>;
};
analytics: {
trackEvent(eventName: string, properties?: Record<string, any>): void;
identifyUser(userId: string, traits?: Record<string, any>): void;
};
}
}
ããã§ãã©ã®TypeScriptãã¡ã€ã«ã§ããå®å šãªåãã§ãã¯ã§ãããã®ã°ããŒãã«ããããã£ã«ã¢ã¯ã»ã¹ã§ããŸãã
// In any .ts file
console.log(window.myAppConfig.apiBaseUrl);
window.analytics.trackEvent('page_view', { path: '/dashboard' });
// TypeScript will catch errors:
// window.analytics.trackEvent(123); // Error: Argument of type 'number' is not assignable to parameter of type 'string'.
// console.log(window.myAppConfig.nonExistentProperty); // Error: Property 'nonExistentProperty' does not exist on type '{ apiBaseUrl: string; ... }'.
å®çšäŸ2ïŒãã€ãã£ãåã®æ¡åŒµïŒããªãã£ã«ïŒ
ãã€ãã£ãJavaScriptãããã¿ã€ãïŒäŸïŒArray.prototypeïŒã«æ°ããã¡ãœããã远å ããããªãã£ã«ãŸãã¯ã«ã¹ã¿ã ãŠãŒãã£ãªãã£ã䜿çšããŠããå Žåããããã®æ¡åŒµãã°ããŒãã«ã«å®£èšããå¿
èŠããããŸããäŸãã°ãString.prototypeã«.isEmpty()ã¡ãœããã远å ãããŠãŒãã£ãªãã£ããããšããŸãã
äŸãã°ãsrc/types/polyfills.d.tsã®ãããªãã¡ã€ã«ãäœæããŸãã
// src/types/polyfills.d.ts
export {}; // Ensures this is treated as a module
declare global {
interface String {
isEmpty(): boolean;
isPalindrome(): boolean;
}
interface Array<T> {
/**
* Returns the first element of the array, or undefined if the array is empty.
*/
first(): T | undefined;
/**
* Returns the last element of the array, or undefined if the array is empty.
*/
last(): T | undefined;
}
}
ãããŠãå®éã®JavaScriptããªãã£ã«ãçšæããŸãã
// src/utils/string-polyfills.js
if (!String.prototype.isEmpty) {
String.prototype.isEmpty = function() {
return this.length === 0;
};
}
if (!String.prototype.isPalindrome) {
String.prototype.isPalindrome = function() {
const cleaned = this.toLowerCase().replace(/[^a-z0-9]/g, '');
return cleaned === cleaned.split('').reverse().join('');
};
}
JavaScriptããªãã£ã«ããããã®ã¡ãœããã䜿çšããTypeScriptã³ãŒãã®*åã«*ããŒããããŠããããšã確èªããå¿ èŠããããŸãã宣èšã«ãããTypeScriptã³ãŒãã¯åå®å šæ§ãç²åŸããŸãã
// In any .ts file
const myString = "Hello World";
console.log(myString.isEmpty()); // false
console.log("".isEmpty()); // true
console.log("madam".isPalindrome()); // true
const numbers = [1, 2, 3];
console.log(numbers.first()); // 1
console.log(numbers.last()); // 3
const emptyArray: number[] = [];
console.log(emptyArray.first()); // undefined
// TypeScript will flag if you try to use a non-existent method:
// console.log(myString.toUpper()); // Error: Property 'toUpper' does not exist on type 'String'.
ã°ããŒãã«åå®çŸ©ã®äž»èŠãªèæ ®äºé
- 现å¿ã®æ³šæãæã£ãŠäœ¿çšããïŒåŒ·åã§ããäžæ¹ã§ãã°ããŒãã«ã¹ã³ãŒãã®æ¡åŒµã¯æ§ããã«è¡ãã¹ãã§ããããã¯ãã°ããŒãã«æ±æãã«ã€ãªããå¯èœæ§ããããåã倿°ãä»ã®ã©ã€ãã©ãªãå°æ¥ã®JavaScriptæ©èœãšæå³ããè¡çªããå¯èœæ§ããããŸããããã¯ãç°ãªãããŒã ãç«¶åããã°ããŒãã«å®£èšãå°å ¥ããå¯èœæ§ãããå€§èŠæš¡ãªã°ããŒãã«åæ£ã³ãŒãããŒã¹ã§ç¹ã«åé¡ã«ãªããŸãã
- ç¹ç°æ§ïŒã°ããŒãã«åãå®çŸ©ããéã«ã¯ãå¯èœãªéãå ·äœçã§ããããšãç°¡åã«è¡çªããå¯èœæ§ã®ããäžè¬çãªååã¯é¿ããŠãã ããã
- 圱é¿ïŒã°ããŒãã«å®£èšã¯ã³ãŒãããŒã¹å šäœã«åœ±é¿ãäžããŸããä»»æã®ã°ããŒãã«åå®çŸ©ãæ¬åœã«æ®éçã«å©çšå¯èœã§ããããšãæå³ãããŠãããã¢ãŒããã¯ãã£ããŒã ã«ãã£ãŠåŸ¹åºçã«æ€èšŒãããŠããããšã確èªããŠãã ããã
- ã¢ãžã¥ãŒã«æ§ vs. ã°ããŒãã«ïŒçŸä»£ã®JavaScriptãšTypeScriptã¯ã¢ãžã¥ãŒã«æ§ãåŒ·ãæšå¥šããŠããŸããã°ããŒãã«åå®çŸ©ã«æãåºãåã«ãæç€ºçã«ã€ã³ããŒããããã¢ãžã¥ãŒã«ãäŸåé¢ä¿ãšããŠæž¡ããããŠãŒãã£ãªãã£é¢æ°ããããã¯ãªãŒã³ã§äŸµå ¥çã§ãªããœãªã¥ãŒã·ã§ã³ã«ãªããã©ãããæ€èšããŠãã ããã
ã¢ãžã¥ãŒã«æ¡åŒµïŒdeclare module 'module-name' { ... }ïŒ
ã¢ãžã¥ãŒã«æ¡åŒµã¯ãæ¢åã®ã¢ãžã¥ãŒã«ã®åã«è¿œå ããããã«äœ¿çšãããç¹æ®ãªåœ¢åŒã®ã¢ãžã¥ãŒã«å®£èšã§ããåãæããªãã¢ãžã¥ãŒã«ã®åãäœæããã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšãšã¯ç°ãªããæ¡åŒµã¯ãã§ã«åå®çŸ©ãæã€ã¢ãžã¥ãŒã«ïŒèªèº«ã®.d.tsãã¡ã€ã«ãŸãã¯@typesããã±ãŒãžããïŒãæ¡åŒµããŸãã
ã¢ãžã¥ãŒã«æ¡åŒµã䜿çšããææ
ã¢ãžã¥ãŒã«æ¡åŒµã¯ã次ã®å Žåã«çæ³çãªãœãªã¥ãŒã·ã§ã³ã§ãã
- ãµãŒãããŒãã£ã©ã€ãã©ãªåã®æ¡åŒµïŒäœ¿çšããŠãããµãŒãããŒãã£ã©ã€ãã©ãªã®åã«ã«ã¹ã¿ã ããããã£ãã¡ãœããããŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã远å ããå¿
èŠãããå ŽåïŒäŸïŒExpress.jsã®
Requestãªããžã§ã¯ãã«ã«ã¹ã¿ã ããããã£ã远å ããå ŽåããReactã³ã³ããŒãã³ãã®propsã«æ°ããã¡ãœããã远å ããå ŽåïŒã - ç¬èªã®ã¢ãžã¥ãŒã«ãžã®è¿œå ïŒããŸãäžè¬çã§ã¯ãããŸããããã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåã§ããããã£ãåçã«è¿œå ããå¿ èŠãããå Žåãç¬èªã®ã¢ãžã¥ãŒã«ã®åãæ¡åŒµã§ããŸãããã ããããã¯å€ãã®å Žåããªãã¡ã¯ã¿ãªã³ã°å¯èœãªæœåšçãªèšèšãã¿ãŒã³ã瀺åããŠããŸãã
æ§æãšæ§é
ã¢ãžã¥ãŒã«æ¡åŒµã¯ã¢ã³ããšã³ãã¢ãžã¥ãŒã«ãšåãdeclare module 'module-name' { ... }æ§æã䜿çšããŸãããã¢ãžã¥ãŒã«åãäžèŽããå ŽåãTypeScriptã¯ãããã®å®£èšãæ¢åã®ãã®ãšã€ã³ããªãžã§ã³ãã«ããŒãžããŸããæ£ããæ©èœããããã«ã¯ãéåžžãã¢ãžã¥ãŒã«ãã¡ã€ã«èªäœå
ã«ååšããå¿
èŠããããå€ãã®å Žåã空ã®export {}ãŸãã¯å®éã®ã€ã³ããŒããå¿
èŠã§ãã
// express.d.ts (or any .ts file that's part of a module)
import 'express'; // This is crucial to make the augmentation work for 'express'
declare module 'express' {
interface Request {
user?: { // Augmenting the existing Request interface
id: string;
email: string;
roles: string[];
};
organizationId?: string;
// You can also add new functions to the Express Request object
isAuthenticated(): boolean;
}
// You can also augment other interfaces/types from the module
// interface Response {
// sendJson(data: object): Response;
// }
}
å®çšäŸïŒExpress.js Requestãªããžã§ã¯ãã®æ¡åŒµ
Express.jsã§æ§ç¯ãããå
žåçãªWebã¢ããªã±ãŒã·ã§ã³ã§ã¯ããŠãŒã¶ãŒãèªèšŒãããã®æ
å ±ãreqïŒRequestïŒãªããžã§ã¯ãã«ã¢ã¿ããããããã«ãŠã§ã¢ããããããããŸãããããã©ã«ãã§ã¯ãExpressã®åã¯ãã®ã«ã¹ã¿ã ã®userããããã£ãç¥ããŸãããã¢ãžã¥ãŒã«æ¡åŒµã«ããããããå®å
šã«å®£èšã§ããŸãã
ãŸããExpressã®åãã€ã³ã¹ããŒã«ãããŠããããšã確èªããŠãã ããïŒnpm install express @types/expressã
äŸãã°ãsrc/types/express.d.tsãšãã宣èšãã¡ã€ã«ãäœæããŸãã
// src/types/express.d.ts
// It's crucial to import the module you are augmenting.
// This ensures TypeScript knows which module's types to extend.
import 'express';
declare module 'express' {
// Augment the Request interface from the 'express' module
interface Request {
user?: {
id: string;
email: string;
firstName: string;
lastName: string;
permissions: string[];
locale: string; // Relevant for global applications
};
requestStartTime?: Date; // Custom property added by logging middleware
// Other custom properties can be added here
}
}
ããã§ãTypeScript Expressã¢ããªã±ãŒã·ã§ã³ã¯ãuserããã³requestStartTimeããããã£ãåå®å
šã«äœ¿çšã§ããŸãã
import express, { Request, Response, NextFunction } from 'express';
const app = express();
// Middleware to attach user information
app.use((req: Request, res: Response, next: NextFunction) => {
// Simulate authentication and user attachment
req.user = {
id: 'user-123',
email: 'john.doe@example.com',
firstName: 'John',
lastName: 'Doe',
permissions: ['read', 'write'],
locale: 'en-US'
};
req.requestStartTime = new Date();
next();
});
app.get('/profile', (req: Request, res: Response) => {
if (req.user) {
res.json({
userId: req.user.id,
userEmail: req.user.email,
userLocale: req.user.locale, // Accessing custom locale property
requestTime: req.requestStartTime?.toISOString() // Optional chaining for safety
});
} else {
res.status(401).send('Unauthorized');
}
});
// TypeScript will now correctly type-check access to req.user:
// app.get('/admin', (req: Request, res: Response) => {
// if (req.user && req.user.permissions.includes('admin')) { ... }
// });
app.listen(3000, () => {
console.log('Server running on port 3000');
});
ã¢ãžã¥ãŒã«æ¡åŒµã®äž»èŠãªèæ ®äºé
- Importã¹ããŒãã¡ã³ãïŒã¢ãžã¥ãŒã«æ¡åŒµã®æãéèŠãªåŽé¢ã¯ã宣èšãã¡ã€ã«å
ã®æç€ºçãª
import 'module-name';ã¹ããŒãã¡ã³ãã§ããããããªããšãTypeScriptã¯æ¢åã®ã¢ãžã¥ãŒã«ã®æ¡åŒµã§ã¯ãªããã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšãšããŠæ±ãå¯èœæ§ããããŸãã - ç¹ç°æ§ïŒæ¡åŒµã¯ã¿ãŒã²ãããšããã¢ãžã¥ãŒã«ã«åºæã§ãããããã©ã€ãã©ãªã®åãæ¡åŒµããå Žåãã°ããŒãã«åå®çŸ©ãããå®å šã§ãã
- ã³ã³ã·ã¥ãŒããžã®åœ±é¿ïŒæ¡åŒµãããåã䜿çšãããããããããžã§ã¯ãã¯ã远å ãããåå®å šæ§ã®æ©æµãåããããšãã§ããããã¯ç°ãªãããŒã ã«ãã£ãŠéçºãããå ±æã©ã€ãã©ãªããã€ã¯ããµãŒãã¹ã«ãšã£ãŠçŽ æŽãããããšã§ãã
- ç«¶åã®åé¿ïŒåãã¢ãžã¥ãŒã«ã«å¯ŸããŠè€æ°ã®æ¡åŒµãååšããå ŽåãTypeScriptã¯ããããããŒãžããŸãããããã®æ¡åŒµãäºææ§ããããç«¶åããããããã£å®çŸ©ãå°å ¥ããªãããšã確èªããŠãã ããã
ã°ããŒãã«ããŒã ãšå€§èŠæš¡ã³ãŒãããŒã¹ã®ããã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ããŒã ã§éçšããåºç¯ãªã³ãŒãããŒã¹ã管çããçµç¹ã«ãšã£ãŠãå宣èšã«å¯Ÿããäžè²«ããèŠåŸããã¢ãããŒããæ¡çšããããšã¯æéèŠã§ãããããã®ãã¹ããã©ã¯ãã£ã¹ã¯ãè€éããæå°éã«æããTypeScriptã®åã·ã¹ãã ã®å©ç¹ãæå€§åããã®ã«åœ¹ç«ã¡ãŸãã
1. ã°ããŒãã«ãæå°éã«æããã¢ãžã¥ãŒã«æ§ãåªå ãã
å¯èœãªéããåžžã«ã°ããŒãã«åå®çŸ©ãããæç€ºçãªã¢ãžã¥ãŒã«ã€ã³ããŒããåªå ããŠãã ãããã°ããŒãã«å®£èšã¯ãç¹å®ã®ã·ããªãªã§ã¯äŸ¿å©ã§ãããåè¡çªã远跡ãå°é£ãªäŸåé¢ä¿ãããã³å€æ§ãªãããžã§ã¯ãéã§ã®åå©çšæ§ã®äœäžã«ã€ãªããå¯èœæ§ããããŸããæç€ºçãªã€ã³ããŒãã¯ãåãã©ãããæ¥ãŠããããæç¢ºã«ããç°ãªãå°åã®éçºè ã«ãšã£ãŠã®å¯èªæ§ãšä¿å®æ§ãåäžãããŸãã
2. .d.tsãã¡ã€ã«ãäœç³»çã«æŽçãã
- å°çšãã£ã¬ã¯ããªïŒãããžã§ã¯ãã®ã«ãŒãã«å°çšã®
src/types/ãŸãã¯types/ãã£ã¬ã¯ããªãäœæããŸããããã«ããããã¹ãŠã®ã«ã¹ã¿ã å宣èšã1ã€ã®èŠã€ããããå Žæã«ä¿æãããŸãã - æç¢ºãªåœåèŠåïŒå®£èšãã¡ã€ã«ã«ããããããååã䜿çšããŸããã¢ã³ããšã³ãã¢ãžã¥ãŒã«ã®å Žåãã¢ãžã¥ãŒã«ã®ååãä»ããŸãïŒäŸïŒ
d3-legacy-charts.d.tsïŒãã°ããŒãã«åã®å Žåãglobal.d.tsãaugmentations.d.tsã®ãããªäžè¬çãªååãé©åã§ãã tsconfig.jsonæ§æïŒtsconfig.jsonããããã®ãã£ã¬ã¯ããªãtypeRootsïŒã°ããŒãã«ã¢ã³ããšã³ãã¢ãžã¥ãŒã«çšïŒãšincludeïŒãã¹ãŠã®å®£èšãã¡ã€ã«çšïŒã«æ£ããå«ãã§ããããšã確èªããTypeScriptã³ã³ãã€ã©ãããããèŠã€ããããããã«ããŸããäŸãã°ïŒ{ "compilerOptions": { // ... "typeRoots": [ "./node_modules/@types", "./src/types" ], "moduleResolution": "node" }, "include": [ "src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts" ] }
3. ãŸãæ¢åã®@typesããã±ãŒãžã掻çšãã
ãµãŒãããŒãã£ã©ã€ãã©ãªçšã®ã«ã¹ã¿ã .d.tsãã¡ã€ã«ãèšè¿°ããåã«ãåžžã«npmã«@types/{library-name}ããã±ãŒãžãååšãããã©ããã確èªããŠãã ããããããã¯ãã°ãã°ã³ãã¥ããã£ã«ãã£ãŠã¡ã³ããã³ã¹ãããå
æ¬çã§ãææ°ã®ç¶æ
ã«ä¿ãããŠãããããããŒã ã®å€å€§ãªåŽåãç¯çŽããæœåšçãªãšã©ãŒãæžããããšãã§ããŸãã
4. ã«ã¹ã¿ã å宣èšãææžåãã
ã«ã¹ã¿ã ã®.d.tsãã¡ã€ã«ã«ã¯ããã®ç®çãäœã宣èšããŠãããããªãå¿
èŠã ã£ãããæç¢ºã«èª¬æããã³ã¡ã³ããèšè¿°ããŠãã ãããããã¯ãã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªåãè€éãªã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšã«ãšã£ãŠç¹ã«éèŠã§ãããæ°ããããŒã ã¡ã³ããŒãã·ã¹ãã ãããæ©ãçè§£ããå°æ¥ã®éçºãµã€ã¯ã«ã§ã®å¶çºçãªç Žæãé²ãã®ã«åœ¹ç«ã¡ãŸãã
5. ã³ãŒãã¬ãã¥ãŒããã»ã¹ãžã®çµ±å
ã«ã¹ã¿ã å宣èšããã¡ãŒã¹ãã¯ã©ã¹ã®ã³ãŒããšããŠæ±ããŸããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãšåã峿 Œãªã³ãŒãã¬ãã¥ãŒããã»ã¹ã«ãããã¹ãã§ããã¬ãã¥ãŒæ åœè ã¯ãæ£ç¢ºæ§ãå®å šæ§ããã¹ããã©ã¯ãã£ã¹ã®éµå®ãããã³ã¢ãŒããã¯ãã£äžã®æ±ºå®ãšã®äžè²«æ§ã確èªããå¿ èŠããããŸãã
6. åå®çŸ©ã®ãã¹ã
.d.tsãã¡ã€ã«ã«ã¯ã©ã³ã¿ã€ã ã³ãŒãã¯å«ãŸããŸãããããã®æ£ç¢ºæ§ã¯éåžžã«éèŠã§ããdts-jestã®ãããªããŒã«ã䜿çšããŠãåãã¹ãããèšè¿°ããããåã«ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ã·ã¥ãŒãã³ãŒããåãšã©ãŒãªãã§ã³ã³ãã€ã«ãããããšã確èªããããšãæ€èšããŠãã ãããããã¯ãå宣èšãåºã«ãªãJavaScriptãæ£ç¢ºã«åæ ããŠããããšã確èªããããã«äžå¯æ¬ ã§ãã
7. åœéåïŒi18nïŒãšããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒl10nïŒã®åœ±é¿ãèæ ®ãã
å宣èšã¯äººéã䜿çšããèšèªã®èгç¹ããã¯èšèªã«äŸåããŸããããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ãå¯èœã«ããäžã§éèŠãªåœ¹å²ãæãããŸãã
- äžè²«ããããŒã¿æ§é ïŒåœéåãããæååãæ¥ä»åœ¢åŒããŸãã¯é貚ãªããžã§ã¯ãã®åãæç¢ºã«å®çŸ©ããããã¹ãŠã®ã¢ãžã¥ãŒã«ãšãã±ãŒã«ã§äžè²«ããŠäœ¿çšãããŠããããšã確èªããŸãã
- ããŒã«ã©ã€ãŒãŒã·ã§ã³ãããã€ããŒïŒã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«ããŒã«ã©ã€ãŒãŒã·ã§ã³ãããã€ããŒã䜿çšããŠããå Žåããã®åïŒäŸïŒ
window.i18n.translate('key')ïŒã¯é©åã«å®£èšãããã¹ãã§ãã - ãã±ãŒã«åºæã®ããŒã¿ïŒåã¯ããã±ãŒã«åºæã®ããŒã¿æ§é ïŒäŸïŒäœæåœ¢åŒïŒãæ£ããåŠçãããããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãç°ãªãå°ççå°åããã®ããŒã¿ãçµ±åããéã®ãšã©ãŒãåæžããŸãã
äžè¬çãªèœãšã穎ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°
æ éãªèšç»ãç«ãŠãŠããå宣èšã®äœæ¥ã¯æãšããŠèª²é¡ãæç€ºããããšããããŸããäžè¬çãªèœãšã穎ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ãã³ããããã€ã玹ä»ããŸãã
- ãCannot find module 'X'ããŸãã¯ãCannot find name 'Y'ãïŒ
- ã¢ãžã¥ãŒã«ã®å ŽåïŒã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšæååïŒäŸïŒ
'my-library'ïŒãimportã¹ããŒãã¡ã³ãã®å 容ãšå®å šã«äžèŽããŠããããšã確èªããŠãã ããã - ã°ããŒãã«åã®å ŽåïŒ
.d.tsãã¡ã€ã«ãtsconfig.jsonã®includeé åã«å«ãŸããŠããããšãããã³ãããã°ããŒãã«ã¢ã³ããšã³ããã¡ã€ã«ã§ããå Žåã¯ãã®å«ããã£ã¬ã¯ããªãtypeRootsã«ããããšã確èªããŠãã ããã tsconfig.jsonã®moduleResolutionèšå®ããããžã§ã¯ãã«é©ããŠããããšïŒéåžžã¯"node"ïŒã確èªããŠãã ããã
- ã¢ãžã¥ãŒã«ã®å ŽåïŒã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšæååïŒäŸïŒ
- ã°ããŒãã«å€æ°åã®ç«¶åïŒã°ããŒãã«åïŒäŸïŒ
var MY_GLOBALïŒãå®çŸ©ããå¥ã®ã©ã€ãã©ãªãŸãã¯ã³ãŒãã®äžéšãåãååã§äœãã宣èšãããšãç«¶åãçºçããŸããããã¯ãã°ããŒãã«ãæ§ããã«äœ¿çšãããšããã¢ããã€ã¹ã匷åããŸãã declare globalã«å¯Ÿããexport {}ã®å¿ãïŒ.d.tsãã¡ã€ã«ã«ã°ããŒãã«å®£èšã®ã¿ãå«ãŸããimportãŸãã¯exportããªãå ŽåãTypeScriptã¯ããããã¹ã¯ãªãããã¡ã€ã«ããšããŠæ±ãããã®ãã¹ãŠã®å 容ãdeclare globalã©ãããŒãªãã§ã°ããŒãã«ã«å©çšå¯èœã«ãªããŸããããã¯æ©èœãããããããŸããããexport {}ãæç€ºçã«äœ¿çšããããšã§ãã¢ãžã¥ãŒã«ãšããŠæ±ããã¢ãžã¥ãŒã«ã³ã³ããã¹ãå ããã°ããŒãã«ã¹ã³ãŒããæ¡åŒµãããšããæå³ãæç¢ºã«declare globalã§ç€ºãããšãã§ããŸãã- éè€ããã¢ã³ããšã³ã宣èšïŒç°ãªã
.d.tsãã¡ã€ã«ã§åãã¢ãžã¥ãŒã«æååã«å¯ŸããŠè€æ°ã®ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšãããå ŽåãTypeScriptã¯ããããããŒãžããŸããããã¯éåžžæçã§ããã宣èšãéäºæã§ããå Žåã«åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã - IDEãåãèªèããªãïŒæ°ãã
.d.tsãã¡ã€ã«ã远å ããããtsconfig.jsonã倿ŽãããããåŸãIDEïŒVS Codeãªã©ïŒãTypeScriptèšèªãµãŒããŒãåèµ·åããå¿ èŠãããå ŽåããããŸãã
çµè«
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«ãã°ããŒãã«åå®çŸ©ãããã³ã¢ãžã¥ãŒã«æ¡åŒµãå«ãTypeScriptã®ã¢ãžã¥ãŒã«å®£èšæ©èœã¯ãéçºè ãTypeScriptãæ¢åã®JavaScriptãšã³ã·ã¹ãã ãšã·ãŒã ã¬ã¹ã«çµ±åããã«ã¹ã¿ã åãå®çŸ©ã§ãã匷åãªæ©èœã§ããè€éãªãœãããŠã§ã¢ãæ§ç¯ããã°ããŒãã«ããŒã ã«ãšã£ãŠããããã®æŠå¿µãç¿åŸããããšã¯åãªãåŠè¡çãªæŒç¿ã§ã¯ãªããå ç¢ã§ã¹ã±ãŒã©ãã«ãã€ä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæäŸããããã®å®è·µçãªå¿ èŠæ§ã§ãã
ã¢ã³ããšã³ãã¢ãžã¥ãŒã«å®£èšã¯ãç¬èªã®åå®çŸ©ãæããªãå€éšJavaScriptã¢ãžã¥ãŒã«ãèšè¿°ããããã®é Œãã«ãªãææ®µã§ãããã³ãŒããšéã³ãŒãã¢ã»ããã®äž¡æ¹ã§åå®å
šãªã€ã³ããŒããå¯èœã«ããŸããã°ããŒãã«åå®çŸ©ã¯ãããæ
éã«äœ¿çšãããŸãããã°ããŒãã«ã¹ã³ãŒããæ¡åŒµãããã©ãŠã¶ã®windowãªããžã§ã¯ãããã€ãã£ããããã¿ã€ããå¢è£ã§ããŸããã¢ãžã¥ãŒã«æ¡åŒµã¯ãæ¢åã®ã¢ãžã¥ãŒã«å®£èšã«è¿œå ããããã®å€ç§çãªæ¹æ³ãæäŸããExpress.jsã®ãããªåºã䜿çšãããŠããã©ã€ãã©ãªã®åå®å
šæ§ãåäžãããŸãã
ã¢ãžã¥ãŒã«æ§ã®åªå
ã宣èšãã¡ã€ã«ã®æŽçãå
¬åŒã®@typesã®æŽ»çšãã«ã¹ã¿ã åã®åŸ¹åºçãªææžåãšãã£ããã¹ããã©ã¯ãã£ã¹ãéµå®ããããšã§ãããŒã ã¯TypeScriptã®å
šèœåãæŽ»çšã§ããŸããããã«ããããã°ã®åæžãã³ãŒãã®æçåã倿§ãªå°ççå Žæãæè¡çèæ¯ãæã€ããŒã éã§ã®ããå¹ççãªã³ã©ãã¬ãŒã·ã§ã³ãå®çŸããæçµçã«ãããå埩åã®ããæåãããœãããŠã§ã¢éçºã©ã€ããµã€ã¯ã«ãä¿é²ãããŸãããããã®ããŒã«ã掻çšããæ¯é¡ã®ãªãåå®å
šæ§ãšæçãã§ã°ããŒãã«éçºã®åãçµã¿ã匷åããŠãã ããã